package editor;

import com.javadocking.model.FloatDockModel;
import com.javadocking.dockable.*;
import com.javadocking.dockable.action.DefaultDockableStateActionFactory;
import com.javadocking.dockable.action.DefaultDockableStateAction;
import com.javadocking.dock.*;
import com.javadocking.dock.factory.SingleDockFactory;
import com.javadocking.DockingManager;
import com.javadocking.drag.DragListener;
import com.javadocking.event.DockingListener;
import com.javadocking.event.DockingEvent;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class FloatChildDocks extends JPanel
{
	// Static fields.

	public static final int FRAME_WIDTH = 600;
	public static final int FRAME_HEIGHT = 450;

	// Constructor.

	public FloatChildDocks(JFrame frame)
	{
		super(new BorderLayout());

		// Create the dock model for the docks.
		FloatDockModel dockModel = new FloatDockModel();
		dockModel.addOwner("frame0", frame);

		// Give the dock model to the docking manager.
		DockingManager.setDockModel(dockModel);

		// Create the content components.
		TextPanel textPanel1 = new TextPanel("I am window 1.");
		TextPanel textPanel2 = new TextPanel("I am window 2.");
		TextPanel textPanel3 = new TextPanel("I am window 3.");

		// Create the dockables around the content components.
		Icon icon = new ImageIcon();
		Dockable dockable1 = new DefaultDockable("Window1", textPanel1, "Window 1", icon);
		Dockable dockable2 = new DefaultDockable("Window2", textPanel2, "Window 2", icon);
		Dockable dockable3 = new DefaultDockable("Window3", textPanel3, "Window 3", icon);
		Dockable dockable4 = new DefaultDockable("Window4", new JLabel("LKJ"), "Window 4", icon);

		// Create the single child docks for the float dock.
		SingleDock singleDock1 = new SingleDock();
		SingleDock singleDock2 = new SingleDock();

		// Add the dockables to the single docks.
		singleDock1.addDockable(dockable1, SingleDock.SINGLE_POSITION);
		singleDock2.addDockable(dockable2, SingleDock.SINGLE_POSITION);

		// Create the tab dock.
		TabDock tabDock = new TabDock();

		// Add the dockable to the tab dock.
		tabDock.addDockable(dockable3, new Position(0));

		TabDock tabDock2 = new TabDock();
		tabDock2.addDockable(dockable4, new Position(0));

		// The position for the float child docks.
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		int x = screenSize.width  / 2 - 100;
		int y = screenSize.height / 2 - 100;

		// Get the float dock. This is a standard dock of the floating dock model.
		FloatDock floatDock = dockModel.getFloatDock(frame);
		floatDock.setChildDockFactory(new SingleDockFactory());
		floatDock.setDockPriority(Priority.CAN_DOCK_WITH_PRIORITY);

		// Add the child docks to the float dock.
		floatDock.addChildDock(singleDock1, new Position(x, y, 0));
		floatDock.addChildDock(singleDock2, new Position(x + 50, y + 50, 1));

		// Add the 1 root dock to the dock model.
		dockModel.addRootDock("tabDock", tabDock, frame);

		// Add the split pane to the panel.
		add(tabDock, BorderLayout.EAST);

	}

	/**
	 * This is the class for the content.
	 */
	private class TextPanel extends JPanel implements DraggableContent
	{

		private JLabel label;

		public TextPanel(String text)
		{
			super(new FlowLayout());

			// The panel.
			setMinimumSize(new Dimension(80,80));
			setPreferredSize(new Dimension(150,150));
			setBackground(Color.white);
			setBorder(BorderFactory.createLineBorder(Color.lightGray));

			// The label.
			label = new JLabel(text);
			label.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
			add(label);
		}

		// Implementations of DraggableContent.

		public void addDragListener(DragListener dragListener)
		{
			addMouseListener(dragListener);
			addMouseMotionListener(dragListener);
			label.addMouseListener(dragListener);
			label.addMouseMotionListener(dragListener);
		}
	}

	// Main method.

	public static void createAndShowGUI()
	{

		// Create the frame.
		JFrame frame = new JFrame("Float dock");

		// Create the panel and add it to the frame.
		FloatChildDocks panel = new FloatChildDocks(frame);
		frame.getContentPane().add(panel);

		// Set the frame properties and show it.
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		frame.setLocation((screenSize.width - FRAME_WIDTH) / 2, (screenSize.height - FRAME_HEIGHT) / 2);
		frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
		frame.setVisible(true);

	}

	public static void main(String args[])
	{
        Runnable doCreateAndShowGUI = new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        };
        SwingUtilities.invokeLater(doCreateAndShowGUI);
    }

}